package xpn.platform.common.rulesengine;

import javax.script.ScriptException;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * 简单规则引擎接口，使用JavaScript做为规则引擎语言。
 * 
 * 规则表达式中支持的缺省函数有： hasRole(注入的用户变量, 角色名称)，例如hasRole(SysUser,"管理员") <br>
 * {@link #injectObjects(Object...)} <br>
 * {@link #injectObjects(InjectedObject...)}<br>
 * {@link #executeRule(String)}<br>
 * {@link #isTrue(String)}<br>
 * 
 * @author bobatkm
 * @version 2017年8月23日 上午11:17:39
 */
public interface SimpleRulesEngine {
	/**
	 * 注入规则表达式的对象
	 * 
	 * @author bobatkm
	 * @version 2017年8月23日 上午11:18:45
	 */
	@Data
	@AllArgsConstructor
	class InjectedObject {
		private Object obj; // 注入的对象
		private String refVarName; // 引用对象的变量名：在规则表达式中使用此变量名来访问对象obj。注意：不能全小写。
	}

	/**
	 * 注入对象列表到规则引擎
	 * 
	 * @param objList
	 * @return
	 */
	boolean injectObjects(Object... objList);

	/**
	 * 注入对象列表到规则引擎
	 * 
	 * @param objList
	 *            ：注入规则表达式的InjectedObject对象列表
	 * @return
	 */
	boolean injectObjects(InjectedObject... objList);

	/**
	 * 执行指定的规则表达式，返回执行结果
	 * 
	 * @author bobatkm
	 * @version 2017年8月23日 上午11:18:11
	 * 
	 * @param ruleExpression
	 *            ：规则表达式
	 * @return 执行结果对象
	 */
	Object executeRule(String ruleExpression) throws ScriptException;

	/**
	 * 判断指定的规则表达式是否为真
	 * 
	 * @author bobatkm
	 * @version 2017年8月23日 上午11:18:11
	 * @param ruleExpression
	 *            ：规则表达式
	 * @return true或者false
	 */
	Boolean isTrue(String ruleExpression) throws ScriptException;
}
